package com.serializeQueue;

import java.util.List;
import java.util.concurrent.ExecutorService;

/*

    任务队列

    内部维护一个线程池

 */
public class TaskQueue<T extends  SerializableTask> {

    //线程池,任务的实际执行者
    ExecutorService service;

    TaskSerializer<T> serializer;

    ExceptionHandler<T> handler;

    ExpiredTaskHandler<T> expiredTaskHandler;

    TaskQueue() {
    }

    //初始化
    void init() {

        //获取所有的任务,视为过期任务进行处理
        List<T> list = serializer.allTasks();

        list.forEach(task -> {
            expiredTaskHandler.handle(task);
        });

    }

    //提交一个可序列化的任务
    public boolean submit(T task) {

        task.setCreateTime(System.currentTimeMillis());

        //TODO 如果是集群中多个服务实例,需要更换id生成策略
        task.setId(System.currentTimeMillis() + "-" + task.hashCode());

        try {

            //任务提交至线程池之前先持计划
            serializer.serialize(task);

            //提交任务至线程池
            service.submit(() -> {
                try {

                    //执行任务
                    task.run();

                    //任务完成后移除任务
                    serializer.remove(task.getId());
                } catch (Exception e) {

                    //任务执行过程中或移除任务时出现的异常交给异常处理器处理
                    handler.onException(task, e);
                }
            });

            //任务提交成功返回true
            return true;
        } catch (Exception e) {

            //提交失败返回false
            return false;
        }


    }

}
